package com.bos.report.factory;

import com.bos.dao.SekolahDAO;
import com.bos.domain.Anggaran;
import com.bos.domain.JumlahSiswa;
import com.bos.domain.Sekolah;
import com.bos.report.model.Bos02;
import com.bos.util.NumberUtil;
import com.bos.util.enums.JenjangSekolah;
import com.bos.util.enums.SatuanPendidikan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: Latief
 * Date: 5/22/11
 * Time: 9:20 PM
 * To change this template use File | Settings | File Templates.
 */
@Repository
public class Bos02Factory extends ReportFactory<Bos02> {

    public final static String KEY_NAMA_KAB = "namaKab";
    public final static String KEY_KAB_KOTA = "kabkota";
    public final static String KEY_SK = "sk";
    public final static String KEY_TANGGAL = "tanggal";
    public final static String KEY_PERIODE = "periode";
    public final static String KEY_TINGKAT_SEKOLAH = "tingkatSekolah";
    public final static String KEY_PROPINSI = "prop";
    public final static String KEY_FORMAT = "format";
    public final static String KEY_JABATAN = "jabatan";
    public final static String KEY_NIP = "nip";
    public final static String KEY_NAMA = "nama";

    /**
     * Digunakan untuk mengambil data Sekolah sebagai acuan data source.
     */
    private SekolahDAO sekolahDAO;

    public Bos02Factory() {
        super();
        responseParameter.put(KEY_PROPINSI, "ACEH");
        responseParameter.put(KEY_SK, "801/A6/047/2009");
        responseParameter.put(KEY_NAMA, "DRS. SOFYAN SULAIMAN");
        responseParameter.put(KEY_JABATAN, "Kepala Dinas Pendidikan,Pemuda dan Olahraga");
        responseParameter.put(KEY_NIP, "19530811 198103 1 007");
    }

    /**
     * Ambil sekolahReferenceList dari database. Digunakan sebagai data acuan untuk memapping data source.
     *
     * @param jenjangSekolah
     * @return
     */
    protected List<Sekolah> loadReferenceDataSource(JenjangSekolah jenjangSekolah) {
        return sekolahDAO.findByJenjangSekolah(jenjangSekolah);
    }

    /**
     * Melakukan mapping sekolahReferenceList ke mapDataSource.
     *
     * @param jenjangSekolah
     * @return
     */
    protected Map<String, Bos02> mappingReferenceDataSource(JenjangSekolah jenjangSekolah) {
        //ambil sekolahReferenceList.
        List<Sekolah> sekolahReferenceList = loadReferenceDataSource(jenjangSekolah);

        //lakukan mapping berdasarkan nss sekolah.
        Map<String, Bos02> mapDataSource = new HashMap<String, Bos02>();
        for (Sekolah sekolah : sekolahReferenceList) {
            Bos02 bos02 = new Bos02();
            bos02.setNss(sekolah.getNss());
            bos02.setNama(sekolah.getNama());
            bos02.setAlamat(sekolah.getAlamat());
            bos02.setKecamatan(sekolah.getKelurahan().getKecamatan().getNama());
            bos02.setNegeri("-");
            bos02.setSwasta("-");
            if (sekolah.getSatuanPendidikan() == SatuanPendidikan.NEGERI)
                bos02.setNegeri("NEGERI");
            if (sekolah.getSatuanPendidikan() == SatuanPendidikan.SWASTA)
                bos02.setSwasta("SWASTA");
            bos02.setJumlahMurid("0");
            bos02.setAlokasi("0");

            mapDataSource.put(sekolah.getNss(), bos02);
        }

        return mapDataSource;
    }

    /**
     * Konversikan mapping data source ke dalam List datasource.
     *
     * @param mapDataSource
     */
    protected void convertMapDataSourceToDataSource(Map<String, Bos02> mapDataSource) {
        dataSource = new ArrayList<Bos02>();

        if (mapDataSource == null)
            return;

        //Konversikan ke List data source
        dataSource.addAll(mapDataSource.values());
    }

    protected void fillModelAndViewParameter(JenjangSekolah jenjangSekolah){
        putResponseParameter(Bos02Factory.KEY_TINGKAT_SEKOLAH, jenjangSekolah + "");
        if (jenjangSekolah.equals(JenjangSekolah.SD))
            putResponseParameter(Bos02Factory.KEY_FORMAT, "A");
        if (jenjangSekolah.equals(JenjangSekolah.SMP))
            putResponseParameter(Bos02Factory.KEY_FORMAT, "B");

        putResponseParameter(KEY_DATASOURCE_SIZE, dataSource.size() + "");
    }

    public void fillDataSource(JenjangSekolah jenjangSekolah, List<Anggaran> anggarans, List<JumlahSiswa> jumlahSiswas) {
        Map<String, Bos02> mapDataSource = null;
        if (jenjangSekolah != null) {

            //ambil mapping data source
            mapDataSource = mappingReferenceDataSource(jenjangSekolah);

            //Isikan alokasi anggaran ke map datasource yang sesuai.
            if (anggarans != null) {
                for (Anggaran anggaran : anggarans) {
                    Bos02 bos02 = mapDataSource.get(anggaran.getSekolah().getNss());
                    bos02.setAlokasi(NumberUtil.convertToNumberSeparator(anggaran.getKucuran()));
                }
            }

            //Isikan jumlah siswa ke map datasource yang sesuai
            if (jumlahSiswas != null) {
                for (JumlahSiswa jumlahSiswa : jumlahSiswas) {
                    Bos02 bos02 = mapDataSource.get(jumlahSiswa.getSekolah().getNss());

                    int jml = jumlahSiswa.getKelas1L() + jumlahSiswa.getKelas1P() + jumlahSiswa.getKelas2L()
                            + jumlahSiswa.getKelas2P() + jumlahSiswa.getKelas3L() + jumlahSiswa.getKelas3P()
                            + jumlahSiswa.getKelas4L() + jumlahSiswa.getKelas4P() + jumlahSiswa.getKelas5L()
                            + jumlahSiswa.getKelas5P() + jumlahSiswa.getKelas6L() + jumlahSiswa.getKelas6P()
                            + jumlahSiswa.getKelas7L() + jumlahSiswa.getKelas7P() + jumlahSiswa.getKelas8L()
                            + jumlahSiswa.getKelas8P() + jumlahSiswa.getKelas9L() + jumlahSiswa.getKelas9P();
                    bos02.setJumlahMurid(jml + "");
                }
            }
        }

        //Konversikan map data source ke dalam List data source
        convertMapDataSourceToDataSource(mapDataSource);

        //isikan model and view parameter
        fillModelAndViewParameter(jenjangSekolah);
    }

    @Autowired
    public void setSekolahDAO(SekolahDAO sekolahDAO) {
        this.sekolahDAO = sekolahDAO;
    }
}
